#ifndef NET_POLLER_H
#define NET_POLLER_H

#include "channel.h"
#include <unordered_map>
#include <vector>
#include <sys/epoll.h>

namespace net {

// 定义最大的epoll事件数量
constexpr int MAX_EPOLLEVENTS = 1024;

/**
 * @class Poller
 * @brief 对epoll模型进行封装，实现epoll的IO事件添加、删除、修改、获取活跃连接功能
 */
class Poller
{
public:
    /**
     * @brief 构造函数，创建epoll实例
     */
    Poller();

    /**
     * @brief 析构函数，关闭epoll实例
     */
    ~Poller();

    /**
     * @brief 添加或修改监控事件
     * @param channel 要操作的Channel对象
     */
    void updateEvent(Channel* channel);

    /**
     * @brief 移除监控事件
     * @param channel 要移除的Channel对象
     */
    void removeEvent(Channel* channel);

    /**
     * @brief 开始监控，返回活跃连接
     * @param active 用于存储活跃的Channel指针的向量
     */
    void poll(std::vector<Channel*>* active);

private:
    /**
     * @brief 对epoll进行直接操作，如添加、修改、删除事件
     * @param channel 要操作的Channel对象
     * @param op epoll_ctl的操作类型（EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL）
     */
    void update(Channel* channel, int op);

    /**
     * @brief 判断一个Channel是否在事件监控中
     * @param channel 要检查的Channel对象
     * @return 如果在监控中返回true，否则返回false
     */
    bool hasChannel(Channel* channel);

    int _epFd;      // epoll实例的文件描述符
    struct epoll_event _evs[MAX_EPOLLEVENTS];       // 用于存储epoll_wait返回的就绪事件
    std::unordered_map<int, Channel*> _channels;    // 存储文件描述符和对应的Channel指针
};

} // namespace net

#endif // NET_POLLER_H